package Juego;

import java.util.ArrayList;
import java.util.Observable;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import Construibles.EstBomberos;
import Construibles.ZonaResidencial;
import Excepciones.FueraDeLimites;
import MapaStuff.Mapa;
import Ubicacion.Punto;

public class Poblacion extends Observable implements SerializablePropia{

	private ArrayList<ZonaResidencial> residencias;
	
	public Poblacion(){
		residencias = new ArrayList <ZonaResidencial>();
	}
	
	public void crecer(){
		for (ZonaResidencial zonaActual: this.residencias){
			zonaActual.actualizar();
		}
		setChanged();
		notifyObservers();
	}
	
	public int poblacionActual(){
		int poblacionActual=0;
		for (ZonaResidencial zonaActual: this.residencias){
			poblacionActual=poblacionActual + zonaActual.habitantesActuales();
			}
		return poblacionActual;
	}
	
	public void agregarResidencia (ZonaResidencial unaZona){
		this.residencias.add(unaZona);
	}
	
	public int pagarImpuestos(){
		return (this.poblacionActual()*10);
	}

	@Override
	public Element serializar(Document doc) {
		Element elePoblacion=doc.createElement("Poblacion");
		Element eleZonas=doc.createElement("Zonas");
		elePoblacion.appendChild(eleZonas);
		SerializadorPorUbicacionEnElMapa.serializarPorUbicacionEnElMapa(eleZonas, doc,residencias);
		return elePoblacion;
	}

	private static class AgregadorDePoblacion implements Agregador{

		private Poblacion poblacion;
		public AgregadorDePoblacion(Poblacion poblacion){
			this.poblacion=poblacion;
		}
		public void agregar(SerializablePropia elemento) {
			poblacion.agregarResidencia((ZonaResidencial)elemento);
		}	
	}
	
	public static Poblacion hidratar(Node item) {
		Element elePoblacion=(Element)item;
		Poblacion pob=new Poblacion();
		Element eleZona=(Element) elePoblacion.getChildNodes().item(0);
		SerializadorPorUbicacionEnElMapa.hidratarPorUbicacionEnElMapa(eleZona,new AgregadorDePoblacion(pob));
		return pob;
	}

	public void eliminarZona(ZonaResidencial zona) {
		while(residencias.remove(zona));
		
	}
	
}
